#include "server.hpp"

 uint64_t con_id=0;
 EventLoop base_evp;
 std::vector<LoopThread> loop_threads(2);//线程池
 LoopThreadPool* loop_pool;
 int nextloop=0;//下一个线程池的索引
// void HandleClose(Channel* cha)
// {
//   //  cout<<" close: "<<cha->Fd()<<endl;
//     DBG_LOG("close:%d",cha->Fd());
//     cha->Remove();
//     delete cha;

// }
// void HandleRead(Channel* cha)
// {
//     int fd=cha->Fd();
//     char buf[1024]={0};
//     int ret=recv(fd,buf,1023,0);//阻塞式从fd读取到buf
//     if(ret<=0)
//     {
//         cout<<"recv failed"<<endl;
//         return HandleClose(cha);
//     }
//     DBG_LOG("recv data:%s",buf);
//    // cout<<"recv data:"<<buf<<endl;
//     cha->EnableWrite();//读完了就可以写了
   
// }

// void HandleWrite(Channel* cha)
// {
//     int fd=cha->Fd();
//   const  char* data="对的";
//     int ret=send(fd,data,strlen(data),0);
//     if(ret<0)
//     {
//         cout<<"send failed"<<endl;
//         return HandleClose(cha);
//     }
//     cha->DisableWrite();
// }
// void HandleError(Channel* cha)
// {
//     return HandleClose(cha);

// }

// void HandleEvent(EventLoop*loop,Channel* cha,int timerid)
// {
//     cout<<"有一个事件"<<endl;
//     loop->TimerRefresh(timerid);
// }

void Onconnected(const PtrConnection& conn)
{
    cout<<"in Onconnected"<<endl;
    DBG_LOG("connected: %d", conn->Fd());
    
}

void OnMessage(const PtrConnection& conn, Buffer* buf)
{
    DBG_LOG("message: %d", conn->Fd());
   char buff[1024]={0};
   buf->ReadandPop(buff, buf->Readablesize());//从输入缓冲区读取数据到buff中
   DBG_LOG("received data: %s", buff);
  
   std::string str="hello world";
   conn->Send(str.c_str(), str.size());//发送字符串到客户端
}

void connectionDestroy(const PtrConnection& conn)
{
    DBG_LOG("connection destroy: %d", conn->Fd());
    // 连接销毁时的处理逻辑
}

std::unordered_map<uint64_t,PtrConnection> _conns;//新建一个unordered_map用于存储新连接的connection对象
void Newconnection(int fd)
{
     con_id++;//连接id自增
  
     
   nextloop=(nextloop+1)%loop_threads.size();//轮询线程池

    PtrConnection conn(new Connection(loop_pool->GetNextLoop(),con_id,fd));
    conn->SetMessageCallback(std::bind(OnMessage,std::placeholders::_1,std::placeholders::_2));//为业务处理的回调函数
    conn->SetSrvCloseCallback(std::bind(connectionDestroy,std::placeholders::_1));//设置con销毁的回调函数
    conn->SetConnectedCallback(std::bind(Onconnected,std::placeholders::_1));//设置连接完成的回调函数
  

    //非活跃连接的释放
    conn->EnableInactiveRelease(10);//设置非活跃连接的释放时间为10秒
    conn->Established();//建立连接
    _conns[con_id]=conn;//将新连接存入unordered_map中
    //定时销毁任务：必须在启动读事件之前，该销毁的任务fd是随机的，
    //有可能启动读事件后对应fd刚好来了事件，内部也就有了任务，就不算是非活跃连接了
   DBG_LOG("new base_loop");
}
//createserver->channel->acceptor->newcha给对应fd配备函数->server开启读，等待接收client发来的事件并处理

int main()
{
   // Poller poller;
  // srand(time(NULL));
 
  //cout<<"evp"<<endl;
    // Socket lst_sock;
   // cout<<"lst_sock"<<endl;
   // lst_sock.CreateServer(8501);

   loop_pool=new LoopThreadPool(&base_evp);//创建线程池
   loop_pool->SetThreadCount(2);//设置线程池的线程个数
    loop_pool->Start();//启动线程池

   Acceptor ace(&base_evp, 8501);//创建一个Acceptor对象，绑定到8501端口
   // Channel channel(&evp,lst_sock.Getfd());//创建一个Channel对象，绑定到监听套接字的文件描述符上
  //  cout<<"channel"<<endl;
  ace.SetAcceptorCallback(std::bind(Newconnection,std::placeholders::_1));//设置接受连接的回调函数
  ace.LiSten();//开始监听端口
  // cout<<"SetReadCallback"<<endl;
   // channel.EnableRead();
  //  cout<<"EnableRead"<<endl;
        base_evp.start();
       
 
    // while(1)
    // {
    //     std::vector<Channel*> actives;
    //     poller.Poll(&actives);//阻塞等待actives内的channel
    //     for(auto& a:actives)
    //     {
    //         a->HandleEvent();// 有事件到来就处理
    //     }
    // }
   // lst_sock.Close();
    return 0;
}
